/**
  * \file umlitem.h
  * \brief UmlItem repräsentiert die Oberklasse aller UML-Items
  *
  * \author Wolf Bublitz
  */

#ifndef UmlItem_H
#define UmlItem_H

#include <QDebug>
#include <QString>
#include <QUuid>
#include <QPointF>
#include <QFont>
#include <QGraphicsItemGroup>
#include <QMenu>
#include <QGraphicsSceneContextMenuEvent>
#include <QGraphicsDropShadowEffect>
#include <QFlags>
#include <QFlag>

#include "uml/projects/umlproject.h"
#include "uml/fontpainter.h"
#include "uml/umldatatypes.h"


class  UmlItem : public FontPainter
{
public:
    enum ItemType {
        UmlItemType                     = 1,
        UmlGraphicsItemType             = 2,
        UmlRelationalItemType           = 4,
        UmlPackageItemType              = 8,
        UmlClassItemType                = 16,
        UmlInterfaceItemType            = 32,
        UmlAbstractItemType             = 64,
        UmlRelationType                 = 128,
        UmlClassAttributeType           = 256,
        UmlClassMethodeType             = 512
    };

    Q_DECLARE_FLAGS(ItemTypes, ItemType);

    UmlItem(UmlProject *parent = 0);

    bool isOfType(UmlItem::ItemTypes itemType);

    void appendItemType(UmlItem::ItemTypes itemType);
    void removeItemType(UmlItem::ItemTypes itemType);

    QFlags<UmlItem::ItemType> type();

    /*! Gibt die eindeutige ID des UML-Items zurück.
      \sa _id
      \return ID als String
    */
    QString id();

    /*! Setzt die eindeutige ID des UML-Items.
      \sa _id
      \param id neue ID
    */
    void setId(QString id);

    /*! Gibt den Namen des UML-Items zurück.
      \sa _name
      \return Name
    */
    virtual QString name();

    /*! Setzt den Namen des UML-Items.
      \sa _name
      \param name neuer Name
    */
    virtual void setText(QString name);

    /*! Gibt die Uml-Beschriftung des UmlItems zurück.
      \sa _name
      \sa _umlText
      \return Uml-Beschriftung
    */
    virtual QString umlText();

    /*! Gibt das Projekt zurück dem dieses UML-Item zugeordnet ist.
      \return UML-Projekt
    */
    UmlProject* project();

    /*! Setzt das Projekt dem dieses UML-Item zugeordnet werden soll.
      \param project Project
    */
    virtual void setProject(UmlProject *project);

protected:
    UmlItem::ItemTypes _itemTypeFlags;

    /// Hält eine eindeutige ID.
    QString _id;

    /// Hält den UML-Bezeichner.
    QString _name;

    /// Hält die UML-Beschriftung
    QString _umlText;

    /// Hält des Rect das die Beschriftung umschließt.
    QRectF _umlTextRect;

    /// Hält den UML-Datentyp
    UmlItem::ItemType _itemType;    

    /// Hält das Project dem dieses UML-Item zugeordnet ist.
    UmlProject *_project;

    /// Diese Methode aktualisiert die geometrischen Eigenschaften des UML-Item.
    virtual void updateUmlText();

};

Q_DECLARE_OPERATORS_FOR_FLAGS(UmlItem::ItemTypes);

#endif // UmlItem_H
